package mao.exaimnation.tengxun;

import java.util.*;

/**
 * @author Totoro
 * @date 2020/9/6
 * @explain: 团队合并：  n个人，属于M个团队，有些人属于多个团队，但是也可能属于零个。
 *           将一个信息，发送给0号员工，他会转发给团队其他人，其他人会转达给团队其他人
 *            请问有多少人知道了这条消息。
 *            思路1：每个团队有编号，如果后面出现的团队里面有之前已经出现过的人（这些人已经属于其他团队），那么
 *            就将前面的团队和后面的出现的团队进行合并，（使用后面的团队编号）
 *
 *            思路2:首先统计每个人属于多少个团队，然后构造树节点，有共同员工的。：：不合适，这样处理有许多人属于两个
 *            团队，造成多统计。
 */
public class Main2 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        while (scanner.hasNext()){
           int n = scanner.nextInt();
           int m = scanner.nextInt();
           int[] teamNums = new int[n];
           int nums = 1;//编号零留给不属于任何团队的人。

            for (int i = 0; i < m; i++) {
                int x = scanner.nextInt();
                //与当前团队有连接的团队
                Set<Integer> mergeTeam = new HashSet<>();
                for (int k = 0; k < x ; k++) {
                    int tmp = scanner.nextInt();
                    //该员工已经属于其他团队，所以可以将其与当前团队合并。
                    if (teamNums[tmp] != 0){
                        mergeTeam.add(teamNums[tmp]);
                    }
                    //设置团队编号。
                    teamNums[tmp] = nums;
                }
                //团队合并。
                for (int j = 0; j < n; j++) {
                    if (mergeTeam.contains(teamNums[j])){
                        teamNums[j] = nums;
                    }
                }
                nums++;
            }

            //统计同一团队的人的个数。
            int count = 0;
            int teamNumOf0 = teamNums[0];
            if (teamNumOf0 == 0){  //加了这
                System.out.println(1);
            }else {
                for (int i = 0; i < n; i++) {
                    if (teamNums[i] == teamNumOf0){
                        count++;
                    }
                }
                System.out.println(count);
            }
        }
    }
}
